Halaman ini merupakan catatan penelitian tentang keberadaan ruang publik di balik sebuah tagar yang digunakan di media sosial. Keberadaan ruang publik di sini diidentifikasi melalui tiga dimensi ruang publik, yaitu: (1) dimensi struktural; (2) dimensi representasional; dan (3) dimensi interaksional. Identifikasi terhadap tiga dimensi tersebut dibagi menjadi di folder. Bagian ini akan berusahan mengidentifikasi, menjelaskan, dan memaknai berbagai aktivitas warga net di Twitter terkait dengan keberadaan tagar #jogjaoradidol di twitter. Berikut adalah pertanyaan yang mencoba dijawab:
Bagaimana keterlibatan masyarakat dalam penggunaan tagar #jogjaoradidol di Twitter?
Untuk menjawab pertanyaan tersebut, tiga indikator dimensi struktural ruang publik, yaitu: (1) inklusif ada kesempatan yang sama untuk terlibat dalam diskuis; (2) bebas dari kepentingan kekuasaan dan ekonomi; dan (3) memungkinkan terbentuknya opini publik.
Pembahasan dibagi menjadi beberapa bagian. Pertama, membahas berbagai aktivitas warga net di dalam Twitter. Kedua, membahas berbagai kejadian di dunia nyata yang melatari penggunaan tagar. Ketiga, membahas makna keberadaan tagar sebagai sebuah ruang yang dapat dijadikan tempat untuk mendiskusikan kebijakan.
library(lubridate)
library(tidyverse)
library(tidytext)
library(stringr)
library(lubridate)
library(tm)
library(reshape2)
library(scales)
library(AnomalyDetection)
library(anomalize)
Di sini saya akan terlebih dahulu mempersiapkan file yang ingin dianalisis. Persiapan meliputi membuat semua variable dalam format yang tepat, hingga menambah variabel baru berdasarkan data yang ada.
Variabel yang ingin ditambahkan adalah: 1. Identitas logical twit sebagai duplicate atau bukan 2. Username dan count username 3. Membagi data menjadi beberapa kluster berdasarkan tanggal posting 4. Menambah kolom untuk teks yang sudah dibersihkan 5. Menambah kolom jumlah term per row dari teks yang sudah diberishkan 6. Mengekstrak tagar tiap row 7. Menghitung jumlah tagar per baris.
Saat ini, data sudah memiliki 10 kolom, oleh dengan rencana diatas maka data akan memiliki 17 kolom.
# import data
raw_jod <- read.csv("hasil-new1.csv", stringsAsFactors = FALSE, header = FALSE, sep = ",")
nama_kolom1 <- c("date", "time", "username", "tweets", "replying", "rep_count", "ret_count", "fav_count", "link")
colnames(raw_jod) <- nama_kolom1
# transform date format
raw_jod$date <- as.Date(raw_jod$date, format = "%Y/%m/%d")
#raw_jod$time <- hms(raw_jod$time, roll = FALSE, quiet = FALSE)
# tranform NA to 0 in fav_count, rep_count, and ret_count
raw_jod$ret_count <- as.integer(raw_jod$ret_count)
raw_jod <- tidyr::replace_na(raw_jod, list(fav_count=0, rep_count=0, ret_count=0))
raw_jod <- raw_jod %>%
dplyr::mutate(is_duplicate = duplicated(tweets))
jod_dup <- raw_jod %>%
filter(is_duplicate == TRUE)
jod_no_dup <- raw_jod %>%
filter(is_duplicate == FALSE)
Jumlah total twit = 13493
Jumlah twit yang memiliki duplicte = 866
Jumlah twit yang tidak memiliki duplicte = 12627
Untuk melihat perkembangan penggunaan tagar, twit dibagi menjadi beberapa periode berdasarkan tahapan perkembangan sebuah gerakan sosial. Salah satu referensi dapat dilihat di sini.
fase1 <- raw_jod %>%
subset(date >= "2013-10-07" & date <= "2013-12-31" ) %>%
mutate(fase = "1_Emergence")
fase2 <- raw_jod %>%
subset(date >= "2014-01-01" & date <= "2014-10-31" ) %>%
mutate(fase = "2_Coalescence")
fase3 <- raw_jod %>%
subset(date >= "2014-11-01" & date <= "2015-10-31" ) %>%
mutate(fase = "3_Bureaucratization")
fase4 <- raw_jod %>%
subset(date >= "2015-11-01" & date <= "2017-08-31" ) %>%
mutate(fase = "4_Decline")
raw_jod <- bind_rows(fase1, fase2, fase3, fase4)
Catatan: Ada satu row yang hilang, padahal parameter tanggal sudah sesuai dengan rentang waktu. Kemungkinannya, ada salah satu row di kolom date yang kosong. Untuk selanjutnya, jumlah twit yang akan dianalisis sebanya 13492.
Script berikut ini membuat dua buah kolom yang berisi daftar username yang diambil dari kolom username dan tweets. Kolom lainnya merupakan jumlah username per baris yang menunjukkan jumlah username yang terlibat dalam sebuah twit.
# menambah @ pada kolom username
raw_jod$username <- paste("@", raw_jod$username, sep="")
# menggabungkan kolom username dengan tweet
raw_jod$user_all <- paste(raw_jod$username, raw_jod$tweets, sep=" ")
# mengekstrak username dari kolom hasil gabungan di atas
raw_jod$user_all <- sapply(str_extract_all(raw_jod$user_all, "@\\S+", simplify = FALSE), paste, collapse=" ")
# merenggangkan tanda : setelah username
raw_jod$user_all <- gsub(":", " \\1 ", raw_jod$user_all, perl=T)
raw_jod$user_count <- sapply(raw_jod$user_all, function(x) length(unlist(strsplit(as.character(x), "@\\S+"))))
Script berikut ini digunakan untuk membuat kolom twit yang sudah dibersihkan dari:
Selain itu, script di bawah ini juga membuat kolom baru yang berisi jumlah term per kolom. Kolom baru ini selanjutnya akan digunakan sebagai parameter utama untuk membuat data input untuk lDA.
Menjalankan fungsi cleaner pada kolom tweets
jod_clean <- tweet_cleaner(raw_jod$tweets)
jod_clean$word_count <- sapply(jod_clean$clean_text, function(x) length(unlist(strsplit(as.character(x), "\\W+"))))
Menggabungkan hasil cleaning dengan data awal
raw_jod <- bind_cols(raw_jod, jod_clean)
# zzzzzz clean environment
rm(jod_clean)
# mengekstrak username dari kolom hasil gabungan di atas
raw_jod$hashtag <- sapply(str_extract_all(raw_jod$tweets, "#\\S+", simplify = FALSE), paste, collapse=" ")
# merenggangkan tanda : setelah username
#raw_jod$user_all <- gsub(":", " \\1 ", raw_jod$user_all, perl=T)
raw_jod$tag_count <- sapply(raw_jod$hashtag, function(x) length(unlist(strsplit(as.character(x), "@\\S+"))))
Untuk mendapatkan tilikan, saya coba petakan terlebih dahulu tagar-tagar yang digunakan dalam twit dan melihat 10 tagar dengan frekuensi tertinggi berkembang dalam setiap fase gerakan.
tagar
tagar <- raw_jod %>%
group_by(fase) %>%
unnest_tokens(hashtag, hashtag, to_lower = FALSE) %>%
count(hashtag, sort = TRUE) %>%
arrange(desc(n)) %>%
ungroup()
# viz
tagar %>%
arrange(desc(n)) %>%
top_n(20) %>%
ggplot(aes(x = reorder(hashtag, n), y = n, fill = factor(fase))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~fase) +
labs(x = "Tagar",
y = "Frekuensi")
Figure 1: Tagar paling sering digunakan
user all Pertanyaan: Apakah aktornya juga berkembang?
user_terlibat <- raw_jod %>%
group_by(fase) %>%
unnest_tokens(user_all, user_all, to_lower = FALSE) %>%
count(user_all, sort = TRUE) %>%
arrange(desc(n)) %>%
ungroup()
# viz
user_terlibat %>%
arrange(desc(n)) %>%
top_n(10) %>%
ggplot(aes(x = reorder(user_all, n), y = n, fill = factor(fase))) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~fase) +
labs(x = "Username",
y = "Frekuensi")
Figure 2: Username yang paling sering ada dalam twit
Aktor yang dalam konteks ini direpresentasikan oleh username juga mengalami “perkembangan”. Di mana pada fase awal, tagar lebih sering digunakan oleh username @JogjaOraDidol, dan @JRX_SID lalu pada fase kedua oleh @rembugjogja dan @kilthedj. Pada fase ketiga oleh @dodoputrabangsa dan @joeyakarta. Hal ini menunjukkan bahwa tagar cenderung merepresentasikan sebuah tempat, dimana setiap orang bisa ada didalamnya. Ia tidak terikat hanya dengan salah satu aktor atau pengerak. Hal tersebut dibuktikan dengan adanya perbuahan username.
Idealnya ini bisa dipetakan setelah partisipasi warga net diketahui. Tapi untuk kebutuhan laporan, mari lakukan saja dengan sistematika seperti ini.
partisipasi <- raw_jod[,c("date", "fav_count", "rep_count", "ret_count", "user_count")]
df1 <- partisipasi %>%
count(date)
df2 <- partisipasi %>%
group_by(date) %>%
summarise_all(sum)
jod_dist <- as.data.frame(bind_cols(df1, df2))
jod_dist <- jod_dist %>%
select(date, fav_count, rep_count, ret_count, user_count, tweet_count = n)
Menyimpan data tentang partisipasi
write.csv(jod_dist, "partisipasi_jod.csv")
partisipasi per bulan
per_month <- jod_dist %>%
group_by(bulan=floor_date(date, "month")) %>%
summarize(freq_bulan=sum(tweet_count))
per_month$bulan = factor(months(per_month$bulan), levels = c('January','February','March','April','May','June','July','August','September','October','November','December'))
per_month %>%
ggplot(aes(x = bulan, y = freq_bulan)) +
geom_col(show.legend = FALSE) +
labs(x = NULL,
y = NULL)
plot partisipasi all
# melt the data for ggplot using `reshape2`
jod_dist <- melt(jod_dist, id = "date")
# ploting to goem_line ggplot2
ggplot(data=jod_dist, aes(x=date, y=value, colour=variable)) +
geom_line(show.legend = FALSE) +
scale_x_date(labels = date_format("%Y-%m"),
breaks = date_breaks("6 months")) +
facet_grid(variable~., scales="free") +
theme(legend.position="top")
Figure 3: Distribusi twit, user dan aktvitas pengguna tagar
Apa itu? itu adalah distribusi pengguna, twit, dan aktivitas lainnya selama 1081 hari dari 07-10-2010 sampai 30-08-2017. Jika mengacu pada pembagian periode, di mana data dibagi menjadi empat, maka orang lebih banyak menggunakan tagar pada fase Emergence (mulai 2013-10-07) hingga fase Bureaucratization (berakhir pada 2014-12-31). Setelah itu, partisipasi warga net dalam penggunaan tagar mengalami penurunan.
Hal apa saja yang melatari partisipasi seperti yang ditunjukkan plot di atas? atau ada saja dibali distribusi di atas?
Untuk mendapatkan tilikan dan jawaban pertanyaan di atas, saya mengambil twit dari tanggal-tanggal, di mana orang cenderung lebih sering menggunakan tagar. Di sini, tangal tersebut diambil berdasarkan frekuensi twit yang menjadi anomali dalam setiap fase.
Anomali all
#df1
df1$date <- as.POSIXct(df1$date, format = "%Y-%m-%d")
anomali_all = AnomalyDetectionTs(df1, max_anoms=0.02, direction='both', plot=TRUE)
anomali_all$plot
Figure 4: Anomali penggunaan tagar dari tahun 2013-2017
Secara keseluruhan, anomali terjadi pada:
Rerata twit secara umum = 12 twit per hari
Fase Emergence berasal dari twit yang diunggah dari 2013-10-07 sampai 2013-12-31
fase1_dist <- raw_jod %>%
filter(fase == "1_Emergence") %>%
select(date) %>%
group_by(date) %>%
count(date)
ggplot(fase1_dist, aes(x = date, y = n)) +
geom_line() +
geom_smooth() +
labs(x = NULL,
y = NULL)
fase1_dist %>%
filter(n > 58) %>%
dplyr::arrange(desc(date)) %>%
ggplot(aes(x = as.character(date), y = n)) +
geom_col(show.legend = FALSE) +
coord_flip() +
labs(x = NULL,
y = NULL)
Figure 5: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Emergence
Rerata per hari = 58
Terdapat 14 hari di mana tagar pada fase 1 lebih sering digunakan. 13 hari diantaranya berasal secara berutan dari tanggal 09 oktober 2013 hingga 21 oktober 2013. Sementara satu tanggal lainya dari tanggal 15 November 2013.
Anomali Detection Fase 1
fase1_dist$date <- as.POSIXct(fase1_dist$date)
fase1_anomali = AnomalyDetectionTs(fase1_dist, max_anoms=0.02, direction='both', plot=TRUE)
fase1_anomali$plot
Figure 6: Anomali penggunaan tagar pada fase 1
Terjadi anomali pada tanggal 2013-10-10 dengan frekuensi 895
Fase Coalescence berasal dari twit yang diunggah dari 2014-01-01 sampai 2014-06-30
fase2_dist <- raw_jod %>%
filter(fase == "2_Coalescence") %>%
select(date) %>%
group_by(date) %>%
count(date)
ggplot(fase2_dist, aes(x = date, y = n)) +
geom_line() +
geom_smooth() +
labs(x = NULL,
y = NULL)
fase2_dist %>%
filter(n >= 188) %>%
dplyr::arrange(desc(date)) %>%
ggplot(aes(x = as.character(date), y = n)) +
geom_col(show.legend = FALSE) +
coord_flip() +
labs(x = NULL,
y = NULL)
Figure 7: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Coalescence
Rerata per hari = 15
Anomali Detection Fase 2
fase2_dist$date <- as.POSIXct(fase2_dist$date)
fase2_anomali = AnomalyDetectionTs(fase2_dist, max_anoms=0.02, direction='both', plot=TRUE)
fase2_anomali$plot
Figure 8: Anomali penggunaan tagar pada fase 2
Terjadi anomali frekuensi pada:
Periode ini berasal dari twit yang diunggah dari 2014-07-01 sampai 2014-12-31
fase3_dist <- raw_jod %>%
filter(fase == "3_Bureaucratization") %>%
select(date) %>%
group_by(date) %>%
count(date)
ggplot(fase3_dist, aes(x = date, y = n)) +
geom_line() +
geom_smooth() +
labs(x = NULL,
y = NULL)
fase3_dist %>%
filter(n >= 98) %>%
dplyr::arrange(desc(date)) %>%
ggplot(aes(x = as.character(date), y = n)) +
geom_col(show.legend = FALSE) +
coord_flip() +
labs(x = NULL,
y = NULL)
Figure 9: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Coalescence
Rerata per hari = 12
Anomali Detection Fase 3
fase3_dist$date <- as.POSIXct(fase3_dist$date)
fase3_anomali = AnomalyDetectionTs(fase3_dist, max_anoms=0.02, direction='both', plot=TRUE)
fase3_anomali$plot
Figure 10: Anomali penggunaan tagar pada fase 3
Anomali frekuensi twit terjadi pada:
Periode ini berasal dari twit yang diunggah dari 2015-01-01 sampai 2017-08-30
fase4_dist <- raw_jod %>%
filter(fase == "4_Decline") %>%
select(date) %>%
group_by(date) %>%
count(date)
ggplot(fase4_dist, aes(x = date, y = n)) +
geom_line() +
geom_smooth() +
labs(x = NULL,
y = NULL)
fase4_dist %>%
filter(n >= 14) %>%
dplyr::arrange(desc(date)) %>%
ggplot(aes(x = as.character(date), y = n)) +
geom_col(show.legend = FALSE) +
coord_flip() +
labs(x = NULL,
y = NULL)
Figure 11: Distribusi twit dan tanggal dengan frekuensi diatas rerata pada fase Coalescence
Rerata per hari = 2
Anomali Detection Fase 4
fase4_dist$date <- as.POSIXct(fase4_dist$date, format = "%Y-%m-%d")
fase4_anomali = AnomalyDetectionTs(fase4_dist, max_anoms=0.02, direction='both', plot=TRUE)
fase4_anomali$plot
Figure 12: Anomali penggunaan tagar pada fase 4
Terjadi anomali frekuensi twit pada:
A work by Ujang Fahmi
eppofahmi@gmail.com